// 1. 导入axios包
import axios from 'axios'
import store from '@/store'
import JSONBigInt from 'json-bigint'

// 2. 创建请求实例对象
const request = axios.create({
  // 2.1 指定基准URL
  baseURL: 'http://toutiao.itheima.net/',
  // 所有请求响应回来的原始数据会先经过这个转换器处理，相当于对响应数据进行一次过滤或者格式化
  // 有同学可能会想：为什么不放到响应拦截器里做？
  // 因为响应拦截器的执行时机在此之后，已经迟了，等到进入响应拦截器时，原始数据已经被 axios 默认的 JSON.parse 处理完了，如果后端响应的数据中有大数字，那么等进入响应拦截器时，已经失去精度了
  transformResponse: [
    function (data) {
      try {
        return JSONBigInt.parse(data)
      } catch (err) {
        return data
      }
    },
  ],
})

// 所有的请求，在发出去之前，都会先进入请求拦截器处理，处理完后，才会真正的发送出去
request.interceptors.request.use(
  config => {
    // 接收到的 config 就是发起请求时的那个请求配置对象

    // 在这里统一添加 token 请求头
    // 并不是所有情况都要加，没有登录的时候，没有token的时候，就不需要加，反过来说就是只有当 token 存在时，才需要加请求头
    if (store.state.user.token) {
      config.headers.Authorization = `Bearer ${store.state.user.token}`
      // 不能用这种，因为会直接覆盖整个 headers 对象，如果还有其他的请求头配置，那就也会被覆盖掉，不合理
      // config.headers = { Authorization : `Bearer ${store.state.user.token}` }
    }

    // 一定要返回，如果不写就凉凉，请求就发不出去了，会出错，写请求拦截器，先把 return config 写了，再去写拦截器的逻辑，防止忘记 return
    return config
  },
  err => Promise.reject(err)
)

// 3. 默认导出请求实例对象
export default request
